package com.common.util;

import com.common.enums.user.PasswordLevelEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @author: stefanie-zy
 * @time: 2024/1/29-10:08
 * @description: 密码等级评定工具类
 */
@Component
@Slf4j
@Schema(name = "工具-密码等级评定")
public class PasswordLevelUtil {

    /**
     * 查询密码等级
     * @param password 密码
     * @return 密码等级
     */
    public static PasswordLevelEnum evaluatePasswordStrength(String password) {
        if (isWeak(password)) {
            return PasswordLevelEnum.LOW;
        } else if (isModerate(password)) {
            return PasswordLevelEnum.MEDIUM;
        } else {
            return PasswordLevelEnum.HIGH;
        }
    }

    /**
     * 密码是否弱
     *
     * @param password 密码
     * @return 小于8位密码弱
     */
    private static boolean isWeak(String password) {
        return !(password.length() >= 8);
    }

    /**
     * 密码是否中等
     *
     * @param password 密码
     */
    private static boolean isModerate(String password) {
        if (password.length() >= 8 && password.length() < 12) {
            return containsDigit(password) && containsLowerCase(password);
        }
        return false;
    }

    /**
     * 密码是否包含数字
     *
     * @param password 密码
     */
    private static boolean containsDigit(String password) {
        return password.matches(".*\\d.*");
    }

    /**
     * 密码是否包含小写字母
     *
     * @param password 密码
     */
    private static boolean containsLowerCase(String password) {
        return password.matches(".*[a-z].*");
    }

    /**
     * 密码是否包含特殊字符
     *
     * @param password 密码
     */
    private static boolean containsSpecialChar(String password) {
        return password.matches(".*[!@#$%^&*()_+\\-=\\[\\]{};':\",.<>?/\\\\|].*");
    }
}
